今天主要會講的部分有
Enum作為一種數據類型,可以用來限制允許存放的數據。
例如底下 :
enum Ordertype{
Market,
Limit,
}
let order1 = Ordertype::Market;
let order2 = Ordertype::Limit;
Enum 還有 match 的功能如下
match order1 {
Ordertype::Market => {
// skip
}
Ordertype::Limit => {
//skip
}
}
還有一種用法是
match order1 {
Ordertype::Market => {
// skip
}
_ => {}
}
_ 作為 default 忽略其他種情況
Enum 不只可以做到這樣, Enum 還可以帶上參數或是 struct.
如下
enum Ordertype {
Market(bool, u8),
Limit(bool, u8),
}
let order1 = Ordertype:Market(true,100);
let order2 = Ordertype:Limit(true,105);
// 可以傳遞給其他函數 假設定義好 match 函數了
match(&order1);
match(&order2);
並且和和Struct類型一樣,也可以使用impl
關鍵字為枚舉類型定義方法。
如下
enum Ordertype {
Market { is_buy: bool, price: u8 },
Limit { is_buy: bool, price: u8 },
}
impl Ordertype {
fn breakpoint(&self) -> bool {
match self {
Ordertype::Market { price, .. } | Ordertype::Limit { price, .. } => *price > 100,
}
}
}
Enum 跟 Struct 很像,可以根據場景自行選擇使用哪一個.
Generics 就稍微複雜了一些,但舉個例子,如果今天想要做數字加總,但 Rust 對於數字有明確的規定,不同型別的變數是不能相加的,那難道要每一個型別都寫一個函數嗎,聽起來就不合理對吧.
所以我們可以改成像底下這樣,使用泛型來取代函數宣告的型別.
use std::ops::Add;
fn add_two<T>(a: T, b: T) -> T
where
T: Add<Output = T>,
{
a + b
}
fn main() {
println!("{}", add_two(3_i16, 5_i16)); // 8
println!("{}", add_two(3_i32, 5_i32)); // 8
println!("{}", add_two(2_u64, 7_u64)); // 9
println!("{}", add_two(1.5_f32, 2.0_f32)); // 3.5
}
那其中
where
T: Add<Output = T>,
{
a + b
}
這段是為了給函數一些 constraints,否則 T 還可以接受像 bool 這種不能相加的變數,那這個 Add 其實就是一個特徵,我們昨天也有說到 trait 的一大功能就是可以做為 constraints,那也和 trait 一樣,如果想新增更多限制,就用 + 串連起來即可.
此外,在 struct 中也可以用泛型
struct Point<T> {
x: T,
y: T,
}
let int_point = Point { x: 1, y: 2 };
let float_point = Point { x: 1.5, y: 2.5 };
那今天就先講到這,因為 Rust 的 Struct, Enum , Trait , Generics之間都是有關聯性的,如果之後有時間會在往前把各種例子給補齊,明天主要說明 Rust 異布編程 和 tokio 框架.